package com.zp.self.module.level_4_算法练习.数据结构.链表;

/**
 * @author By ZengPeng
 */
public class 力扣_92_反转链表II {
    //测试
    public static void main(String[] args) {
        ListNode listNode = new 力扣_92_反转链表II().reverseBetween(ListNode.getNode(), 2, 4);
        System.out.println("ok");
    }

    /**
    题目：给你单链表的头指针 head 和两个整数 left 和 right ，其中 left <= right 。
     请你反转从位置 left 到位置 right 的链表节点，返回 反转后的链表 。

     示例 1：
     输入：head = [1,2,3,4,5], left = 2, right = 4
     输出：[1,4,3,2,5]

     示例 2：
     输入：head = [5], left = 1, right = 1
     输出：[5]


    分析：【P 💙💚💜】
       1.遍历+虚拟头节点： 找到left
                           开始交换
                           终止于right
            --执行用时：0 ms, 在所有 Java 提交中击败了100.00%的用户

    边界值 & 注意点：
       1.
     **/
    public ListNode reverseBetween(ListNode head, int left, int right) {
        if(left==right)return head;
        ListNode virtual = new ListNode();
        virtual.next = head;
        int index =1;
        ListNode pro = virtual;
        while (index<left){
            pro = pro.next;
            index++;
        }
        ListNode current = pro.next;
        while (left<right){
            ListNode next = current.next;
            current.next=next.next;
            next.next=pro.next;
            pro.next=next;
            left++;
        }
        return virtual.next;
    }
}
